package com.wchen.gdoc.generate.util;

import java.math.BigDecimal;
import java.util.*;

/**
 * 数据类型工具类
 *
 * @author  wchen
 * @date    2019/11/11
 */
public class DataTypeUtil {
    final static Set<String> COLLECT_TTPE_SET = new HashSet<>();
    final static Set<String> BASE_TYPE_SET = new HashSet<>();
    final static Map<String, String> TRANS_TYPE_MAP = new HashMap<>();
    static {
        BASE_TYPE_SET.add("java.lang.String");
        BASE_TYPE_SET.add("java.lang.Long");
        BASE_TYPE_SET.add("java.lang.Integer");
        BASE_TYPE_SET.add("java.lang.Short");
        BASE_TYPE_SET.add("java.lang.Float");
        BASE_TYPE_SET.add("java.lang.Double");
        BASE_TYPE_SET.add("java.math.BigDecimal");
        BASE_TYPE_SET.add("java.lang.Boolean");
        BASE_TYPE_SET.add("long");
        BASE_TYPE_SET.add("int");
        BASE_TYPE_SET.add("short");
        BASE_TYPE_SET.add("float");
        BASE_TYPE_SET.add("double");
        BASE_TYPE_SET.add("boolean");
        //日期类型
        BASE_TYPE_SET.add("java.time.LocalDateTime");
        BASE_TYPE_SET.add("java.time.LocalDate");
        BASE_TYPE_SET.add("java.time.LocalTime");
        BASE_TYPE_SET.add("java.util.Date");

        //特殊类型处理
        TRANS_TYPE_MAP.put("java.time.LocalTime", "java.lang.String");
        TRANS_TYPE_MAP.put("java.time.LocalDate", "java.lang.String");
        TRANS_TYPE_MAP.put("java.time.LocalDateTime", "java.lang.String");
        TRANS_TYPE_MAP.put("java.util.Date", "java.lang.String");
        TRANS_TYPE_MAP.put("long", "java.lang.Long");
        TRANS_TYPE_MAP.put("int", "java.lang.Integer");
        TRANS_TYPE_MAP.put("short", "java.lang.Short");
        TRANS_TYPE_MAP.put("double", "java.lang.Double");
        TRANS_TYPE_MAP.put("float", "java.lang.Float");
        TRANS_TYPE_MAP.put("byte", "java.lang.Byte");
        TRANS_TYPE_MAP.put("boolean", "java.lang.Boolean");
        TRANS_TYPE_MAP.put("char", "java.lang.Character");

        COLLECT_TTPE_SET.add("java.util.List");
        COLLECT_TTPE_SET.add("java.util.Set");
    }


    /**
     * 匹配特殊类型
     * @param type
     * @return
     */
    public static String getTransType(String type){
        return Objects.isNull(TRANS_TYPE_MAP.get(type)) ? type : TRANS_TYPE_MAP.get(type);
    }

    /**
     * 是否是基本数据类型
     * @param classType
     * @return
     */
    public static Boolean isBaseData(String classType){
        return BASE_TYPE_SET.contains(classType);
    }

    /**
     * 是否是集合数据类型
     * @param classType
     * @return
     */
    public static Boolean isCollectionData(String classType){
        return COLLECT_TTPE_SET.contains(classType);
    }


    public static Boolean isBaseData(Object objValue){

        if(objValue instanceof String){
            return true;
        }else if(objValue instanceof BigDecimal){
            return true;
        }else if(objValue instanceof Boolean){
            return true;
        }else if(objValue instanceof Integer){
            return true;
        }else if(objValue instanceof Float){
            return true;
        }else if(objValue instanceof Double){
            return true;
        }else if(objValue instanceof Short){
            return true;
        }else if(objValue instanceof Byte){
            return true;
        }else if(objValue instanceof Character){
            return true;
        }else{
            return false;
        }
    }

    public static Boolean isListType(String classType){
        return "java.util.List".equals(classType);
    }
}
